package com.tedu.api.date.io;
import  org.junit.Test;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;


/*
* IO：传输数据      C/S 聊天室Version
* API上部分：字符串、包装类、日期类、集合
* ---------电脑有三大件：CPU   硬盘   内存
* API下部分：IO流    ----硬盘----文件数据传输
* 包位置：java.io
* File文件，文件夹类
* 作用：用于表示操作系统中系统的一个文件或者“目录：文件夹”
* 创建File对象--->有参构造器--->”路径+文件/文件夹全称“
* File类方法使用：
* 1.查看该文件或者”文件夹：目录“的属性信息（名字、大小、是否存在）
* 2.操作文件或者”文件夹：目录“（创建、删除）
* 3.访问一个”文件夹：目录“的子项
* */
public class FileAPI {
    @Test
    public void testFile() {
        //创建文件夹
        //需求：当前API下创建文件---手动---demo.txt     char r='\\'
        //        File file=
//    new File("D:\\javaapi\\API\\src\\main" +
//        "\\java\\com\\tedu\\api\\io");
        //相对路径---当前API下创建文件!    项目：Maven结构  main编写代码
        //FileAPI.java   相对于   API 项目下-->从src开始
        //操作系统：路径---    \   代表路径    文件上传至服务器    √
        //                   /   代表路径    文件下载到本地
        //Java任何平台【操作系统】运行  统一路径属性
        //File.separator    静态属性：任何操作系统下转换成正确的路径表示方法
        File file=new File("src"+File.separator+"main" +
                ""+File.separator+"java" +
                ""+File.separator+"com" +
                ""+File.separator+"tedu" +
                ""+File.separator+"api" +
                ""+File.separator+ "com/tedu/api/date/io" +File.separator+"demo.txt");
        //判断文件是否存在的方法
        boolean b= file.exists();
        System.out.println("判断文件是否存在："+b);
    }
    /*
     * 查看文件或者文件夹属性信息
     * getName()     返回值：String
     * 作用：获取文件或者文件夹的名字【注意：不看路径是否对错】
     * Length()      返回值：long
     * 作用：返回当前文件的大小【字节量】
     * exists()      返回值：boolean
     * 作用：判断文件是否存在
     * */

    /*
     * 使用代码完成文件或者目录自动创建
     * createNewFile()
     * 作用：创建一个新文件
     * 需求：使用代码完成 API 项目文件夹下 自动创建 test.txt 文件
     * */
    @Test
    public void testCreate() throws IOException {
        //创建文件夹：路径+全称   ./test.txt
        File file = new File("." + "" + File.separator + "test.txt");
        //判断---如果文件不存在---创建
        //      如果文件存在----不创建
        if (!file.exists()) {
            System.out.println("文件不存在~~~");
             file.createNewFile();
            System.out.println("文件已经创建~");
        }else {
            System.out.println("文件存在，别创建了~");
         }
           }
    /*
     * delete()
     * 作用：删除文件或者文件夹
     * 需求：将API项目下的   test.txt  删除
     * */
    @Test
    public void testDelete(){
        //创建file类   路径：./test.txt   ./不写代表 当前API项目
        File file=new File("test.txt");
        //判断 如果文件 存在--->删除
        //            不存在-->删除
        if(file.exists()){
            System.out.println("文件存在");
             file.delete();
            System.out.println("文件删除~~");
        } else{
            System.out.println("文件已经删除啦~");
        }
    }

    /*
     * mkdir()
     * 作用：创建一个文件夹
     * 需求：在API   项目下 创建一个文件夹 demo
     *
     * 多层文件夹：demo/abc/bcd
     * mkdirs()
     * 作用：创建多层文件夹
     * */
    @Test
    public void testMkdir(){
        //创建File文件/文件夹--->创建demo文件夹/abc/bcd
        File file=new File("demo"+
                ""+File.separator+"abc"+
                ""+File.separator+"bcd");
        //判断 如果文件不存在---创建文件夹
        //             存在---不创建
        if(!file.exists()){
            System.out.println("文件夹不存在");
             file.mkdirs();
            System.out.println("创建文件夹~");
        } else{
            System.out.println("别创建了~");
        }
         }
    /*
     * 作业1：删除多层文件夹 demo/abc/bcd  【不能使用递归】
     *    提示：构造器new File(File parent,"子路径");
     *    不需要exists判断
     * 思路：找到每一级路径【bcd删除完毕--abc删除完毕-demo】
     * */
    @Test
    public void testHomeWork1(){
        //1.创建多层文件夹 demo/abc/bcd
        File parent=new File("demo");
        //构造器使用(父级路径,子级路径) ；父级路径/子级路径
        File child1=new File(parent,"abc");
        File child2=new File(child1,"bcd");

        child2.delete();    //删除bcd
        child1.delete();    //删除abc
        parent.delete();    //删除demo

        //作业2：提示--创建FileFilter接口--匿名内部类
        /*FileFilter ff=new FileFilter() {
            public boolean accept(File pathname) {
                return false;
            }
        };*/
        parent.listFiles(new FileFilter() {
              public boolean accept(File pathname) {
                return false;
            }
        });
    }
    @Test
    public void testZY(){
        File file=new File("."+File.separator+"demo"+
                "."+File.separator+"abc"+
                "."+File.separator+"bcd");
        if(file.exists()){
            System.out.println("bcd文件存在");
              file.delete();
            System.out.println("bcd文件删除~~");
        } else{
            System.out.println("bcd文件已经删除啦~");
        }

        File file1=new File("."+File.separator+"demo"+
                "."+File.separator+"abc");
        if(file1.exists()){
            System.out.println("abc文件存在");
              file1.delete();
            System.out.println("abc文件删除~~");
        } else{
            System.out.println("abc文件已经删除啦~");
        }

        File file2=new File("."+File.separator+"demo");
         if(file2.exists()){
            System.out.println("demo文件存在");
              file2.delete();
            System.out.println("demo文件删除~~");
        }else{
            System.out.println("demo文件已经删除啦~");
        }
    }

    /*
     * 访问文件夹--->所有子项【文件夹和文件】
     * listFiles()   返回值：File[]  文件数组
     * 作用：获取文件夹的所有子项【包含文件夹和文件】
     * isFile()      返回值： boolean
     * 作用：判断是否为文件，是文件true，反之
     * isDirectory   返回值：boolean
     * 作用：判断是否为文件加，是文件夹true，反之
     * 需求：获取 API 项目下所有的文件夹文字
     * */
    @Test
    public void testListFiles() throws IOException {
        //获取 API 项目
        File file=new File("."+File.separator);
        System.out.println(file.getCanonicalFile());
        //过滤：3个文件还有4个文件夹，过滤是文件夹
          if(file.isDirectory()){ //--过滤没有效果---
            //获取到所有的文件夹
            File[] dir=file.listFiles();
            //遍历所有的文件夹名字
            for(int i=0;i<dir.length;i++){  // i  拿到所有下标
                //打印文件夹名字
                System.out.println(dir[i].getName());
            }
        }
    }
}
